package bizerr

import "fmt"

// BizErr 自定义错误
type BizErr struct {
	Code    int    // 错误码
	Message string // 错误信息
	Cause   error  // 起始错误
}

func (e *BizErr) Error() string {
	return fmt.Sprintf("code=%d, msg=%s, cause=%v", e.Code, e.Message, e.Cause)
}

func New(code int, message string, err error) *BizErr {
	return &BizErr{code, message, err}
}

// 0 成功 其他失败

// 10000 1 开头为用户端错误、例如参数错误，账户名存在等

// 20000 2 开头为系统错误，执行超时等

// 30000 3 开头为第三方错误，例如 IP 服务调用出错，数据查询错误，缓存查询错误，消息队列调用出错等

const (
	SUCCESS           = 0     //
	TokenInvalid      = 10001 // token invalid
	AccountNameExists = 10002 // 账户名已经存在
	AccountNotFound   = 10003 // 账户不存在
	AccountPassError  = 10004 // 账户名或密码错误
	GroupOutOfRange   = 10005 // 分组数量超出范围
	GroupNotFound     = 10006 // 分组不存在
	GroupNotPower     = 10007 // 分组不能修改
	LinkNotFound      = 10008 // 短链接不存在
	LinkEnableStatus  = 10009 // 短链接未启用
	LinkValidDate     = 10010 // 短链接已失效
	LinkGenerate      = 10011 // 短链接生成失败

	Server         = 20001 // 系统繁忙
	ServerNotFound = 20002 // 系统资源不存在
	ServerTimeout  = 20003 // 系统请求超时

	DB    = 30001
	Cache = 30002
)

var (
	ErrTokenInvalid      = New(TokenInvalid, "Token 已经失效", nil)
	ErrAccountNameExists = New(AccountNameExists, "账户名已经存在", nil)
	ErrAccountNotFound   = New(AccountNotFound, "账户不存在", nil)
	ErrAccountPassword   = New(AccountPassError, "账户名或密码错误", nil)
	ErrGroupOutOfRange   = New(GroupOutOfRange, "分组数量超出范围", nil)
	ErrGroupNotFound     = New(GroupNotFound, "分组不存在", nil)
	ErrGroupNotPower     = New(GroupNotPower, "分组无权限修改", nil)
	ErrLinkNotFound      = New(LinkNotFound, "短链接不存在", nil)
	ErrLinkEnableStatus  = New(LinkEnableStatus, "短链接未启用", nil)
	ErrLinkValidDate     = New(LinkValidDate, "短链接已失效", nil)
	ErrLinkGenerate      = New(LinkGenerate, "短链接生成失败，请重试", nil)

	ErrServer         = New(Server, "系统繁忙", nil)
	ErrServerNotFound = New(ServerNotFound, "系统资源不存在，请检查路径", nil)
)
